﻿

#include "zyMonthCal.h"


DarkMoonUI::zyMonthCal::zyMonthCal()
{
	SetMember(L"this", (LONG_PTR)this);
	m_obj->setChildWndProc(zyMonthCal_ChildWndProc);
}
DarkMoonUI::zyMonthCal::~zyMonthCal()
{

}
LRESULT WINAPI DarkMoonUI::zyMonthCal::zyMonthCal_ChildWndProc(zyObject* obj, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL* bHandle)
{
	if (message == WM_NOTIFY) {
		NMHDR nm;
		memmove(&nm, (void*)lParam, sizeof(nm));
		if (nm.code == MCN_SELCHANGE) {
			TRegEvent* evtPtr = (TRegEvent*)obj->getRegEvent(L"OnDateSelChange");
			if (evtPtr != nullptr) {
				NMSELCHANGE* dtChange = reinterpret_cast<NMSELCHANGE*>(lParam);
				DOUBLE stSelStart = 0;
				DOUBLE stSelEnd = 0;
				SystemTimeToVariantTime(&dtChange->stSelStart, &stSelStart);
				SystemTimeToVariantTime(&dtChange->stSelEnd, &stSelEnd);
				evtPtr->handler<int>(nm.hwndFrom, stSelStart, stSelEnd);
			}
		}
		else if (nm.code == MCN_GETDAYSTATE) {
			TRegEvent* evtPtr = (TRegEvent*)obj->getRegEvent(L"OnGetDayState");
			if (evtPtr != nullptr) {
				NMDAYSTATE* sta = reinterpret_cast<NMDAYSTATE*>(lParam);
				DOUBLE dt = 0;
				SystemTimeToVariantTime(&sta->stStart, &dt);
				evtPtr->handler<int>(nm.hwndFrom, dt, sta->cDayState, sta->prgDayState);
			}
		}
	}
	return zyCtrol::zyCtrol_ChildWndProc(obj, hWnd, message, wParam, lParam, bHandle);
}
BOOL DarkMoonUI::zyMonthCal::创建(HWND 参数_父窗口, const std::wstring& 参数_标题, POINT 参数_位置, POINT 参数_尺寸, int 参数_ID, int 参数_窗口风格, int 参数_扩展风格)
{
	if (参数_ID == NULL)
		参数_ID = 黑月默认ID();
	return _CreateCtrol(参数_父窗口, 参数_标题, 参数_位置, 参数_尺寸, 参数_ID, 参数_窗口风格 , 参数_扩展风格, L"SysMonthCal32");
}

BOOL DarkMoonUI::zyMonthCal::创建(zyWindow& 参数_父窗口, const std::wstring& 参数_标题, POINT 参数_位置, POINT 参数_尺寸, int 参数_ID, int 参数_窗口风格, int 参数_扩展风格)
{
	if (参数_ID == NULL)
		参数_ID = 黑月默认ID();
	return _CreateCtrol(参数_父窗口.getHwnd(), 参数_标题, 参数_位置, 参数_尺寸, 参数_ID, 参数_窗口风格, 参数_扩展风格, L"SysMonthCal32");
}
int DarkMoonUI::zyMonthCal::开始星期首日(int 参数_开始星期首日) {
	if (参数_开始星期首日)
		return LOWORD(sendMsg(MCM_GETFIRSTDAYOFWEEK, 0, 0));
	else
		return LOWORD(sendMsg(MCM_SETFIRSTDAYOFWEEK, 0, 参数_开始星期首日));
}
DOUBLE DarkMoonUI::zyMonthCal::今天(DOUBLE 参数_今天日期) {
	SYSTEMTIME systimes = { 0 };
	DOUBLE 局部_日期时间;
	if (参数_今天日期 == 0) {
		sendMsg(MCM_GETTODAY, 0, (LPARAM)&systimes);
		SystemTimeToVariantTime(&systimes, &局部_日期时间);
		return 局部_日期时间;
	}
	else {
		VariantTimeToSystemTime(参数_今天日期, &systimes);
		sendMsg(MCM_SETTODAY, 0, (LPARAM)&systimes);
		return 参数_今天日期;
	}
}
DOUBLE DarkMoonUI::zyMonthCal::最大日期(DOUBLE 参数_最大日期) {
	SYSTEMTIME systimes = { 0 };
	DOUBLE 局部_日期时间;
	if (参数_最大日期 == 0) {
		sendMsg(MCM_GETRANGE, 0, (LPARAM)&systimes);
		SystemTimeToVariantTime(&systimes, &局部_日期时间);
		return 局部_日期时间;
	}
	else {
		VariantTimeToSystemTime(参数_最大日期, &systimes);
		sendMsg(MCM_SETRANGE, GDTR_MAX, (LPARAM)&systimes);
		return 参数_最大日期;
	}
}
DOUBLE DarkMoonUI::zyMonthCal::最小日期(DOUBLE 参数_最小日期) {
	SYSTEMTIME systimes = { 0 };
	DOUBLE 局部_日期时间;
	if (参数_最小日期 == 0) {
		sendMsg(MCM_GETRANGE, 0, (LPARAM)&systimes);
		SystemTimeToVariantTime(&systimes, &局部_日期时间);
		return 局部_日期时间;
	}
	else {
		VariantTimeToSystemTime(参数_最小日期, &systimes);
		sendMsg(MCM_SETRANGE, GDTR_MIN, (LPARAM)&systimes);
		return 参数_最小日期;
	}
}
int DarkMoonUI::zyMonthCal::最多选择天数(int 参数_最多选择天数) {//必须有"月历_允许多选"风格
	if (参数_最多选择天数)
		return (int)sendMsg(MCM_GETMAXSELCOUNT, 0, 0);
	else
		return (int)sendMsg(MCM_SETMAXSELCOUNT, 参数_最多选择天数, 0);
}
bool DarkMoonUI::zyMonthCal::置选择日期范围(DOUBLE 参数_首选择日, DOUBLE 参数_尾选择日) {//必须有"月历_允许多选"风格
	SYSTEMTIME 局部_系统时间 = { 0 };
	VariantTimeToSystemTime(参数_首选择日, &局部_系统时间);
	VariantTimeToSystemTime(参数_尾选择日, &局部_系统时间);
	int 局部_返回值 = (int)sendMsg(MCM_SETSELRANGE, 0, (LPARAM)&局部_系统时间);
	return 局部_返回值 != 0;
}
bool DarkMoonUI::zyMonthCal::取选择日期范围(DOUBLE& 参数_首选择日, DOUBLE& 参数_尾选择日) {//必须有"月历_允许多选"风格
	SYSTEMTIME 局部_系统时间 = { 0 };
	int 局部_返回值 = (int)sendMsg(MCM_GETSELRANGE, 0, (LPARAM)&局部_系统时间);
	SystemTimeToVariantTime(&局部_系统时间, &参数_首选择日);
	SystemTimeToVariantTime(&局部_系统时间, &参数_尾选择日);
	return 局部_返回值 != 0;
}
DOUBLE DarkMoonUI::zyMonthCal::选择日期(DOUBLE 参数_选择日期) {//不能有"月历_允许多选"风格
	SYSTEMTIME 局部_系统时间 = { 0 };
	DOUBLE 局部_日期时间 = 0;
	if (参数_选择日期 == 0) {
		sendMsg(MCM_GETCURSEL, 0, (LPARAM)&局部_系统时间);
		SystemTimeToVariantTime(&局部_系统时间, &局部_日期时间);
		return 局部_日期时间;
	}
	else {
		VariantTimeToSystemTime(参数_选择日期, &局部_系统时间);
		sendMsg(MCM_SETCURSEL, 0, (LPARAM)&局部_系统时间);
		return 参数_选择日期;
	}
}
int DarkMoonUI::zyMonthCal::滚动月数(int 参数_滚动月数) {
	if (参数_滚动月数 == 0)
		return (int)sendMsg(MCM_GETMONTHDELTA, 0, 0);
	else
		return (int)sendMsg(MCM_SETMONTHDELTA, 参数_滚动月数, 0);
}